﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*Unity3D研究院之优化Graphics.DrawMeshInstanced（一百一十一）
 * https://www.xuanyusong.com/archives/4683
 * 
 * 如果项目中使用GPU Instancing的话，很多人都会用底层API Graphics.DrawMeshInstanced在Update中绘制。
 * 我们先来做个极端的测试，如下代码所示。
 * 
 * 如下图所示，能看出来在Update每帧都有一个比较高的耗时。 
 * 
 * 
 * 如果每帧的调用Graphics.DrawMeshInstanced的位置矩阵和MaterialPropertyBlock参数都是一致，我就在想能否进行优化。
 * 其实CommandBuffer也有DrawMeshInstanced方法，这样就可以不用在Update里每帧调用了。
 * 当位置矩阵或者MaterialPropertyBlock参数发生变化时在调用DrawMeshInstanced，放入CommandBuffer中渲染。
 * 
 * 看demo2
 * 
 */
namespace Example01_Demo01
{
	public class Demo01 : MonoBehaviour
	{
        Mesh mesh;
        public Material material;
        public Matrix4x4[] m_matrix4x4s = new Matrix4x4[1023];

        public Transform target;
        // Use this for initialization
        void Start()
		{
            mesh = target.GetComponent<MeshFilter>().mesh;
            //material = target.GetComponent<MeshRenderer>().material;
            //material.enableInstancing = true;
            for (int i = 0; i < m_matrix4x4s.Length; i++)
            {
                target.position = UnityEngine.Random.onUnitSphere * 10f;
                m_matrix4x4s[i] = target.localToWorldMatrix;
            }
        }

		// Update is called once per frame
		void Update()
		{
            for (int i = 0; i < 1024; i++)
            {
                Graphics.DrawMeshInstanced(mesh, 0, material, m_matrix4x4s, 1023);
            }
        }
	}
}
